#ifndef CAMARA_H
#define CAMARA_H

#include "punto3d.h"
#include "visor3d_global.h"
#include "angulo.h"
#include "vector3d.h"

#define CAMARA_MODO_PERSPECTIVA 0
#define CAMARA_MODO_ORTOGONAL   1
#define CAMARA_MODO_ORTOGONAL2D 2

class VISOR3D_EXPORT Camara
{
public:
    Camara();
    ~Camara();

    void setAnguoVision(double angulo) { anguloVision = angulo; }
    void setRelacionAnchoAlto(double relacion) { relacionAnchoAlto = relacion; }
    void setProfundidadMinima(double profundidad) { profundidadMinima = profundidad; }
    void setProfundidadMaxima(double profundidad) { profundidadMaxima = profundidad; }

    void setOrigenHorizontalOrto(double origenHorizontalOrto) { this->origenHorizontalOrto = origenHorizontalOrto; }
    void setOrigenVerticalOrto(double origenVerticalOrto) { this->origenVerticalOrto = origenVerticalOrto; } 
    void setAnchoOrto(double anchoOrto) { this->anchoOrto = anchoOrto; }
    void setAltoOrto(double altoOrto) { this->altoOrto = altoOrto; }

    void setPosicion(const Punto3d& posicion) { this->posicion = posicion; }
    void setPuntoMira(const Punto3d& puntoMira) { this->puntoMira = puntoMira; }
    void setVectorArriba(const Punto3d& vectorArriba) { this->vectorArriba = vectorArriba; }

    void setPosicion(double x, double y, double z) { this->posicion.setCoordenadas(x, y, z); }
    void setPuntoMira(double x, double y, double z) { this->puntoMira.setCoordenadas(x, y, z); }
    void setVectorArriba(double x, double y, double z) { this->vectorArriba.setCoordenadas(x, y, z); }

    void setModo(int modo) { this->modo = modo; }

    Vector3d getVectorDireccion() { return Vector3d(posicion, puntoMira); }

    void aplicar();

    void acercar(float desplazamiento);
    void alejar(float desplazamiento);

    void desplazar(const Vector3d& vectorDesplazamiento);
    void desplazar(double x, double y, double z);

    void girar(const Angulo& anguloHorizontal, const Angulo& anguloVertical);
    void girarHorizontalmente(const Angulo& angulo);
    void girarVerticalmente(const Angulo& angulo);
    
    void rotarSobrePuntoVista(const Angulo& anguloHorizontal, const Angulo& anguloVertical);

private:
    double anguloVision;
    double relacionAnchoAlto;
    double profundidadMinima;
    double profundidadMaxima;

    Punto3d posicion;
    Punto3d puntoMira;
    Punto3d vectorArriba;

    int modo;
    double origenHorizontalOrto;
    double origenVerticalOrto;
    double anchoOrto;
    double altoOrto;
};

#endif // CAMARA_H
